www.gusucode.com > VC++ 界面很酷的一款多媒体播放器 > VC++ 界面很酷的一款多媒体播放器/gusucode/xMedia代码注释中/mainwindow.cpp

    //Download by http://www.NewXing.com
/****************************************
*	File:			mainwindow.cpp		*
*	Last modified:	2004.2.7			*
*	Author:			Yuanyi-Zhang		*
*	Version:		0.0.0.1				*
*	CopyLeft 2004   xMedia team			*
****************************************/
/****************************************************************
*																*
* This file may be distributed and/or modified under the terms	*
* of the GNU General Public License version 2 as published by	*
* the Free Software Foundation and appearing in the file		*
* LICENSE.GPL included in the packaging of this file.			*
*																*
****************************************************************/

#pragma warning(disable:4786)

#include <windows.h>
#include <assert.h>
#include <commctrl.h>
#include <math.h>

#include "messagedef.h"
#include "mainwindow.h"
#include "util.h"

#define IDT_MWTIMER  1000

#define IDM_VIDEOWND		1000
#define IDM_PLAYLIST		1001
#define IDM_MINIBROW		1002
#define IDM_EQ				1003
#define IDM_ABOUT			1004
#define IDM_QUIT			1005
//初始化主窗口
bool MainWnd::initials( HWND hwnd )
{
	if( !InitDC() )
	{
		m_ErrorString = _T("初始化DC失败!");
		return false;
	}
	SetWindowSize();

	if( !LoadResource() )
	{
		return false;
	}
	
	if( !InitVolumn() )
	{
		return false;
	}
	SetWindowRegion();
	
	SetTimer( m_hWnd, IDT_MWTIMER, 1000, NULL );
	m_HasCreated = true;
	return true;
}
////////////////////////////
//初始化工具提示
bool MainWnd::InitTooltips( HWND hwnd, HINSTANCE hInst )
{
    HWND hwndTT;                 //Tooltip控件句柄

    //创建Tooltip控件
    hwndTT = CreateWindowEx(WS_EX_TOPMOST,
        TOOLTIPS_CLASS,
        NULL,
        WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,		
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        hwnd,
        NULL,
        hInst,
        NULL
        );
	
	if( hwndTT == NULL )
	{
		m_ErrorString = _T("创建工具提示窗口失败!");
		return false;
	}

    SetWindowPos(hwndTT,
        HWND_TOPMOST,
        0, 0, 0, 0,
        SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

	//这个结构体存储Tooltip控件的相关信息
    TOOLINFO ti;
	unsigned int uid = 0;   

	//初始化ti结构体成员
    ti.cbSize = sizeof(TOOLINFO);
    ti.uFlags = TTF_SUBCLASS;
    ti.hwnd = hwnd;
    ti.hinst = hInst;
    ti.uId = uid;

	TCHAR tcsTooltip[256];

	vector<Element>::iterator ite;
	RECT rect;
	string str;
    for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ )
	{
		rect = ite->getRectPos();
		str = ite->getTooltip();
		if( (rect.left == rect.right && rect.top == rect.bottom) ||
			str.compare( _T("") ) == 0 )
		{
			continue;
		}
		strcpy( tcsTooltip, str.c_str() );
		ti.lpszText = tcsTooltip;
	    ti.rect = rect;
		//添加工具提示
		SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);	
	}
	return true;
}
/////////////////////////
//将窗口消息发送到主窗口消息循环
LRESULT CALLBACK MainWnd::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	MainWnd *pMainWnd;
	if ( uMsg==WM_NCCREATE )
	{   
		assert( ! IsBadReadPtr((void *) lParam, sizeof(CREATESTRUCT)) );
		MDICREATESTRUCT * pMDIC = (MDICREATESTRUCT *) ((LPCREATESTRUCT) lParam)->lpCreateParams;

		pMainWnd = (MainWnd *) (pMDIC->lParam);

		assert( ! IsBadReadPtr(pMainWnd, sizeof(MainWnd)) );
		SetWindowLong(hWnd, GWL_USERDATA, (LONG) pMainWnd);
	}
	else
		pMainWnd=(MainWnd *)GetWindowLong(hWnd, GWL_USERDATA);
	
	return pMainWnd->MsgProc( hWnd, uMsg, wParam, lParam );
}
/////////////////////////
//消息循环
long MainWnd::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	POINT p;
	switch( uMsg )
	{
	case WM_CREATE:
		m_hWnd = hWnd;
		if( !initials( hWnd ) )
		{
			MessageBox( hWnd, "初始化失败,请确保您的声音设备工作正常!","错误",MB_OK|MB_ICONWARNING );
		}
		break;
	case WM_PAINT:
		onDraw();
		break;
	case WM_LBUTTONDOWN:
		SetCapture( hWnd );
		p.x = LOWORD(lParam);
		p.y = HIWORD(lParam);
		ClientToScreen( hWnd, &p );
		onLButtonDown( p );
		break;
	case WM_RBUTTONDOWN:
		PostThreadMessage( GetCurrentThreadId(), MC_POPUPMENU, 0, 0 );
		break;
	case WM_TIMER:
		PostThreadMessage( GetCurrentThreadId(), MC_SETTIME, 0, 0 );
		break;
	case WM_MOUSEMOVE:
		GetCursorPos( &p );
//		ScreenToClient( hWnd, &p );
		onMouseMove( p );
		break;
	case WM_LBUTTONUP:
		ReleaseCapture();
		p.x = LOWORD(lParam);
		p.y = HIWORD(lParam);
		ClientToScreen( hWnd, &p );
		onLButtonUp( p );
		break;
	case WM_KEYDOWN:
		switch( LOWORD( wParam ) )
		{
		case VK_ESCAPE:
			PostThreadMessage( GetCurrentThreadId(), XM_RELEASERESOURCE, 0l, 0l );
			PostQuitMessage( 0 );
			return 0L;
		}
		break;
	case WM_COMMAND:
		switch( LOWORD( wParam ) )
		{
		case IDM_VIDEOWND:
			PostThreadMessage( GetCurrentThreadId(), XM_VWBUTTON, 0l, 0l );
			break;
		case IDM_PLAYLIST:
			PostThreadMessage( GetCurrentThreadId(), XM_PLAYLIST, 0l, 0l );
			break;
		case IDM_EQ:
			PostThreadMessage( GetCurrentThreadId(), XM_EQBUTTON, 0l, 0l );
			break;
		case IDM_MINIBROW:
			PostThreadMessage( GetCurrentThreadId(), XM_MBBUTTON, 0l, 0l );
			break;
		case IDM_ABOUT:
			MessageBox( hWnd, "xMedia Player V1.0\n\n版权所有 2004 xMedia 开发小组", "关于xMedia Player", MB_ICONINFORMATION|MB_OK );
			break;
		case IDM_QUIT:
			PostThreadMessage( GetCurrentThreadId(), XM_RELEASERESOURCE, 0l, 0l );
			PostQuitMessage( 0 );
			break;
		}
		break;
	case XM_MINBOX:
		switch( wParam )
		{
		case ELEM_LBUTTONDOWN:
			SendMessage( hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0l );
			p.x = p.y = 0;
			onMouseMove( p );
			break;
		}
		break;
	case XM_CLOSEBUTTON:
		switch( wParam )
		{
		case ELEM_LBUTTONDOWN:
			PostThreadMessage( GetCurrentThreadId(), XM_RELEASERESOURCE, 0l, 0l );
			PostQuitMessage( 0 );
			break;
		}
		break;
	case XM_SOUNDBAR:
		switch( wParam )
		{ 
		case ELEM_MOUSEMOVE:
			AdjustVolumn();
			break;
		}
		break;
	case XM_TRACKBAR:
		switch( wParam )
		{
		case ELEM_MOUSEMOVE:
			AdjustTrack();
			break;
		}
		break;
	case XM_PROGRESSBAR:
		switch( wParam )
		{
		case ELEM_MOUSEMOVE:
			m_isDraggingElem = true;
			AdjustProgress();
			break;
		case ELEM_LBUTTONUP:
		case ELEM_LBUTTONDOWN:
			m_isDraggingElem = false;
			PostThreadMessage( GetCurrentThreadId(), MC_SEEKING, 0l, 0l );
			break;
		}
		break;
	case XM_EQBUTTON:
		switch( wParam )
		{
		case ELEM_MOUSEMOVE:
			PostThreadMessage( GetCurrentThreadId(), XM_EQBUTTON, 0l, 0l );
			break;
		}
		break;
	case XM_PLAYLIST:
		switch( wParam )
		{
		case ELEM_MOUSEMOVE:
			PostThreadMessage( GetCurrentThreadId(), XM_PLAYLIST, 0l, 0l );
			break;
		}
		break;
	case XM_MBBUTTON:
		switch( wParam )
		{
		case ELEM_MOUSEMOVE:
			PostThreadMessage( GetCurrentThreadId(), XM_MBBUTTON, 0l, 0l );
			break;
		}
		break;
	case XM_PLAYBUTTON:
		switch( wParam )
		{
		case ELEM_LBUTTONDOWN:
			PostThreadMessage( GetCurrentThreadId(), MC_PLAY, 0l, 0l );
			break;
		}
		break;
	case XM_STOPBUTTON:
		switch( wParam )
		{
		case ELEM_LBUTTONDOWN:
			PostThreadMessage( GetCurrentThreadId(), MC_STOP, 0l, 0l );
			break;
		}
		break;
	case XM_PAUSEBUTTON:
		switch( wParam )
		{
		case ELEM_LBUTTONDOWN:
			PostThreadMessage( GetCurrentThreadId(), MC_PAUSE, 0l, 0l );
			break;
		}
		break;
	case XM_PREVBUTTON:
		switch( wParam )
		{
		case ELEM_LBUTTONDOWN:
			PostThreadMessage( GetCurrentThreadId(), MC_PLAYPREV, 0l, 0l );
			break;
		}
		break;
	case XM_NEXTBUTTON:
		switch( wParam )
		{
		case ELEM_LBUTTONDOWN:
			PostThreadMessage( GetCurrentThreadId(), MC_PLAYNEXT, 0l, 0l );
			break;
		}
		break;
	}
	return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
////////////////////////////
//处理鼠标左键按下消息
void MainWnd::onLButtonDown( POINT p )
{
	m_LButtonDown = true;
	m_clickPos = p;
	bool isElemClicked = false;

	ScreenToClient( m_hWnd, &p );

	vector<Element>::iterator ite;
	RECT  validRect;
	for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ )
	{
		if( ite->onLButtonDown( p ) )
		{
			isElemClicked = true;
			validRect = ite->getRectPos();
			InvalidateRect( m_hWnd, &validRect, false );
		}
	}

	if( isElemClicked )
	{
		m_LButtonDown = false;
	}
}
//////////////////////////
//处理鼠标移动消息
void MainWnd::onMouseMove( POINT p )
{
	RECT wndRect;
	GetWindowRect( m_hWnd, &wndRect );
	if( m_LButtonDown )
	{
		wndRect.left += p.x - m_clickPos.x;
		wndRect.right += p.x - m_clickPos.x;
		wndRect.bottom += p.y - m_clickPos.y;
		wndRect.top += p.y - m_clickPos.y;

		m_clickPos = p;

		MoveWindow(m_hWnd, wndRect.left, wndRect.top,
			wndRect.right - wndRect.left,
			wndRect.bottom - wndRect.top,
			true );
	}
	else
	{
		ScreenToClient( m_hWnd, &p );

		vector<Element>::iterator ite;
		RECT  validRect;
		for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ )
		{
			if( ite->onMouseMove( p ) )
			{
				validRect = ite->getRectPos();
				InvalidateRect( m_hWnd, &validRect, false );
			}
		}
	}
}
/////////////////////////
//处理鼠标左键松开消息
void MainWnd::onLButtonUp( POINT p )
{
	if( m_LButtonDown )
	{
		m_LButtonDown = false;
	}
	else
	{
		ScreenToClient( m_hWnd, &p );
		vector<Element>::iterator ite;
		RECT  validRect;
		for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ )
		{
			if( ite->onLButtonUp( p ) )
			{
				validRect = ite->getRectPos();
				InvalidateRect( m_hWnd, &validRect, false );
			}
		}
	}
}
//////////////////////////
//读取批复文件配置信息
bool MainWnd::LoadSkinConfig()
{
	if( m_lpIL == NULL )
	{
		return false;
	}

	string	strWndRect;

	strWndRect = m_lpIL->Get( _T( "mainwindowrect" ) );

	if( strWndRect.compare( _T( "" ) ) == 0 )
	{
		return false;
	}

	m_WndRect = StringToRect( strWndRect );

	m_SkinName = m_lpIL->Get( _T( "skinname" ) );

	m_vecElement.push_back( Element( _T("minbox"), m_lpIL, XM_MINBOX, true ) );
	m_vecElement.push_back( Element( _T("closebutton"), m_lpIL, XM_CLOSEBUTTON, true ) );
	m_vecElement.push_back( Element( _T("songtitle"), m_lpIL, XM_SONGTITLE, true ) );
	m_vecElement.push_back( Element( _T("timewnd"), m_lpIL, XM_TIMEWND, true ) );
	m_vecElement.push_back( Element( _T("wavwnd"), m_lpIL, XM_WAVWND, true ) );
	m_vecElement.push_back( Element( _T("bspwnd"), m_lpIL, XM_BSP, true ) );
	m_vecElement.push_back( Element( _T("freqwnd"), m_lpIL, XM_FREQWND, true ) );
	m_vecElement.push_back( Element( _T("soundslider"), m_lpIL, XM_SOUNDSLIDER, true ) );
	m_vecElement.push_back( Element( _T("trackslider"), m_lpIL, XM_TRACKSLIDER, true ) );
	m_vecElement.push_back( Element( _T("soundbar"), m_lpIL, XM_SOUNDBAR, true ) );
	m_vecElement.push_back( Element( _T("trackbar"), m_lpIL, XM_TRACKBAR, true ) );
	m_vecElement.push_back( Element( _T("eqbutton"), m_lpIL, XM_EQBUTTON, true ) );
	m_vecElement.push_back( Element( _T("mbbutton"), m_lpIL, XM_MBBUTTON, true ) );
	m_vecElement.push_back( Element( _T("playlistbutton"), m_lpIL, XM_PLAYLIST, true ) );
	m_vecElement.push_back( Element( _T("progressslider"), m_lpIL, XM_PROGRESSSLIDER, true ) );
	m_vecElement.push_back( Element( _T("progressbar"), m_lpIL, XM_PROGRESSBAR, true ) );
	m_vecElement.push_back( Element( _T("pausebutton"), m_lpIL, XM_PAUSEBUTTON, true ) );
	m_vecElement.push_back( Element( _T("nextbutton"), m_lpIL, XM_NEXTBUTTON, true ) );
	m_vecElement.push_back( Element( _T("playbutton"), m_lpIL, XM_PLAYBUTTON, true ) );
	m_vecElement.push_back( Element( _T("stopbutton"), m_lpIL, XM_STOPBUTTON, true ) );
	m_vecElement.push_back( Element( _T("prevbutton"), m_lpIL, XM_PREVBUTTON, true ) );
	m_vecElement.push_back( Element( _T("openbutton"), m_lpIL, XM_OPENBUTTON, true ) );
	m_vecElement.push_back( Element( _T("randomflag"), m_lpIL, XM_RANDOMFLAG, true ) );
	m_vecElement.push_back( Element( _T("cycleflag"), m_lpIL, XM_CYCLEFLAG, true ) );
	m_vecElement.push_back( Element( _T("aboutflag"), m_lpIL, XM_ABOUTFLAG, true ) );

	return true;
}
///////////////////////
//注册主窗口类
BOOL MainWnd::RegisterClass( HINSTANCE hInstance )
{
	WNDCLASSEX	wndclass;

	ZeroMemory(&wndclass, sizeof(wndclass));

	//Window class for the main application parent window
	wndclass.cbSize			= sizeof(wndclass);
	wndclass.style			= 0;
	wndclass.lpfnWndProc	= WndProc;
	wndclass.cbClsExtra		= 0;
	wndclass.cbWndExtra		= 0;
	wndclass.hInstance		= hInstance;
	wndclass.hIcon			= 0;
	wndclass.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground	= (HBRUSH)(COLOR_BTNFACE+1);
	wndclass.lpszMenuName	= 0;
	wndclass.lpszClassName	= m_ClassName.c_str();
	wndclass.hIconSm		= 0;

	return RegisterClassEx(&wndclass);
}
////////////////////////////
//设置主窗口可见区域
void MainWnd::SetWindowRegion()
{
	HRGN hWndRgn;
	RECT clientRect,wndRect;
	
	GetClientRect( m_hWnd, &clientRect );
	GetWindowRect( m_hWnd, &wndRect );

	POINT start = { 0, 0 };
	ClientToScreen( m_hWnd, &start );

	hWndRgn = CreateRectRgn( start.x - wndRect.left, 
		start.y - wndRect.top, 
		clientRect.right - clientRect.left + start.x - wndRect.left,
		clientRect.bottom - clientRect.top + start.y - wndRect.top );

	BITMAP bmp;
	GetObject(m_hMaskBmp, sizeof(bmp), &bmp);
	
	HRGN temp;

	HDC hdc = GetDC( m_hWnd );
	HDC hdcImg = CreateCompatibleDC( hdc );
	ReleaseDC( m_hWnd, hdc );

	SelectObject( m_hDCBack, m_hBmpBack );
	SelectObject( hdcImg, m_hMaskBmp );
	BitBlt( m_hDCBack, m_WndRect.left, m_WndRect.top,
		m_WndRect.right - m_WndRect.left,
		m_WndRect.bottom - m_WndRect.top,
		hdcImg, 0, 0, SRCCOPY );

	DeleteObject( hdcImg );

	for( int i = 0; i < bmp.bmWidth; i++ )
	{
		for( int j = 0; j < bmp.bmHeight; j++ )
		{
			if( i == 270 )
				i = 270;
			if( GetPixel( m_hDCBack, i, j ) == RGB( 255, 255, 255 ) )
			{
				temp = CreateRectRgn( start.x - wndRect.left + i, 
					start.y - wndRect.top + j,
					start.x - wndRect.left + i + 1, 
					start.y - wndRect.top + j + 1 );
				CombineRgn( hWndRgn, hWndRgn, temp, RGN_XOR );
				DeleteObject( temp );
			}
		}
	}
	SetWindowRgn( m_hWnd, hWndRgn, false );
}
////////////////////////
//设置窗口大小
void MainWnd::SetWindowSize()
{
	RECT clientRect,wndRect;
	int  width,height;

	GetClientRect( m_hWnd, &clientRect );
	GetWindowRect( m_hWnd, &wndRect );

	width = wndRect.right - wndRect.left - clientRect.right + clientRect.left;
	height = wndRect.bottom - wndRect.top - clientRect.bottom + clientRect.top;

	POINT start = { 0, 0 };
	ClientToScreen( m_hWnd, &start );

	MoveWindow( m_hWnd, 0 - start.x + wndRect.left,
		0 - start.y + wndRect.top, 
		m_WndRect.right - m_WndRect.left + width,
		m_WndRect.bottom - m_WndRect.top + height, true);
}
/////////////////////////
//创建主窗口
bool MainWnd::Create( HINSTANCE hInstance )
{
	if( m_HasCreated )
	{
		m_ErrorString=_T("错误,重复创建主窗口!");
		return false;
	}

	if(!RegisterClass( hInstance ))
	{
		m_ErrorString=_T("注册窗口类失败!");
		return false;
	}

	m_hFont = CreateFont( 10, 5, 0, 0, 6, 0, 0, 0, GB2312_CHARSET, 
					OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
					DEFAULT_QUALITY, FF_DONTCARE, "ms scanf" );

	m_hTitleFont = CreateFont( 0, 0, 0, 0, 7, 0, 0, 0, GB2312_CHARSET, 
					OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
					DEFAULT_QUALITY, FF_DONTCARE, "ms scanf" );

	if( m_hFont == NULL || m_hTitleFont == NULL )
	{
		m_ErrorString=_T("创建字体失败!");
		return false;
	}
	MDICREATESTRUCT mdic;
	memset(& mdic, 0, sizeof(mdic));
	mdic.lParam = (LPARAM) this;

	HWND hwnd=CreateWindow( m_ClassName.c_str(),
			_T("xMediaPlayer"),
			WS_CAPTION|WS_POPUP|WS_CLIPCHILDREN
			|WS_MINIMIZEBOX,
			0,0,100,100,
			NULL,
			NULL,
			hInstance,
			&mdic );

	if( hwnd==NULL )
	{
		m_ErrorString = _T( "创建窗口失败!" );
		return false;
	}
	
	if( !InitTooltips( hwnd, hInstance ) )
	{
		return false;
	}

	return true;
}
//////////////////////////
//初始化DC
bool MainWnd::InitDC()
{
	if( m_hDCBack )
	{
		DeleteObject( m_hDCBack );
	}
	if( m_hBmpBack )
	{
		DeleteObject( m_hBmpBack );
	}

	HDC hdc;
	hdc = GetDC( m_hWnd );
	
	m_hDCBack = CreateCompatibleDC( hdc );
	m_hBmpBack = CreateCompatibleBitmap( hdc, 
		m_WndRect.right - m_WndRect.left,
		m_WndRect.bottom - m_WndRect.top);

	if( !m_hDCBack || !m_hBmpBack )
	{
		return false;
	}

	SelectObject( m_hDCBack, m_hBmpBack );
	return true;
}
///////////////////////
//释放资源	
void MainWnd::ReleaseResource()
{
	if( m_hDCBack )
	{
		DeleteObject( m_hDCBack );
	}
	if( m_hBmpBack )
	{
		DeleteObject( m_hBmpBack );
	}
	if( m_hMaskBmp )
	{
		DeleteObject( m_hMaskBmp );
	}
	if( m_hMainBmp )
	{
		DeleteObject( m_hMainBmp );
	}
	if( m_hElemBmp )
	{
		DeleteObject( m_hElemBmp );
	}
}
////////////////////
//处理主窗口的OnDraw消息
bool MainWnd::onDraw( )
{
	HDC hdc,hdcImg;
	PAINTSTRUCT ps;
	hdc = BeginPaint( m_hWnd, &ps );

	hdcImg = CreateCompatibleDC( hdc );
	SelectObject( hdcImg, m_hMainBmp );
	BitBlt( m_hDCBack, 0, 0,
		m_WndRect.right - m_WndRect.left,
		m_WndRect.bottom - m_WndRect.top,
		hdcImg, 0, 0, SRCCOPY );

	vector<Element>::iterator ite;

	for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ )
	{
		if( !ite->onDraw( m_hDCBack, m_hElemBmp ) )
		{
			return false;
		}
	}

	BitBlt( hdc, 0, 0, m_WndRect.right - m_WndRect.left,
			m_WndRect.bottom - m_WndRect.top, m_hDCBack, 
			0, 0, SRCCOPY );
	
	EndPaint( m_hWnd, &ps );

	DeleteObject( hdcImg );
	DeleteObject( hdc );

	return true;
}
////////////////////
//读取主窗口占用资源
bool MainWnd::LoadResource()
{
	if( m_hMaskBmp )
	{
		DeleteObject( m_hMaskBmp );
	}
	if( m_hMainBmp )
	{
		DeleteObject( m_hMainBmp );
	}
	if( m_hElemBmp )
	{
		DeleteObject( m_hElemBmp );
	}

	string maskBmp,mainBmp,elemBmp;

	maskBmp = _T( "skin\\" ) + m_SkinName + _T( "\\mask.bmp" );
	mainBmp = _T( "skin\\" ) + m_SkinName + _T( "\\main.bmp" );
	elemBmp = _T( "skin\\" ) + m_SkinName + _T( "\\mainelement.bmp" );

	m_hMaskBmp = (HBITMAP)LoadImage( NULL, maskBmp.c_str(),
		IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION );

	if( !m_hMaskBmp )
	{
		m_ErrorString = _T("无法读取文件:") + maskBmp;
		return false;
	}
	
	m_hMainBmp = (HBITMAP)LoadImage( NULL, mainBmp.c_str(),
		IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION );

	if( !m_hMainBmp )
	{
		m_ErrorString = _T("无法读取文件:") + mainBmp;
		return false;
	}

	m_hElemBmp = (HBITMAP)LoadImage( NULL, elemBmp.c_str(),
		IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION );

	if( !m_hElemBmp )
	{
		m_ErrorString = _T("无法读取文件:") + elemBmp;
		return false;
	}

	return true;
}
/////////////////////////////
//调整播放音量
void MainWnd::AdjustVolumn()
{
	Element* soundBar = getElementByName( _T("soundbar") );
	Element* soundSlider = getElementByName( _T("soundslider") );
		
	RECT validRect = soundSlider->getRectPos();
	  
	int vol = adjustSlider( soundSlider, soundBar );

	WORD iVol = (( 100 - vol ) * 0xffff)/100;

	int lTrack,rTrack;
	if( m_Track < 50 )
	{
		rTrack = m_Track;
		lTrack = 50;
	}
	else
	{
		rTrack = 50;
		lTrack = 100 - m_Track;
	}


	WORD lVol = (WORD)((iVol * lTrack)/50);
	WORD rVol = (WORD)((iVol * rTrack)/50);

	DWORD sVol = rVol;
	sVol <<= 16;
	sVol |= lVol;

	waveOutSetVolume( m_hWaveOut, sVol );

	InvalidateRect( m_hWnd, &validRect, false );
}
/////////////////////////////
//调整声道
void MainWnd::AdjustTrack()
{
	Element* trackBar = getElementByName( _T("trackbar") );
	Element* trackSlider = getElementByName( _T("trackslider") );
	
	RECT validRect = trackSlider->getRectPos();
	  
	m_Track = adjustSlider( trackSlider, trackBar );
	
	AdjustVolumn();

	InvalidateRect( m_hWnd, &validRect, false );
}
///////////////////////////////
//调整播放进度
void MainWnd::AdjustProgress()
{
	Element* progressBar = getElementByName( _T("progressbar") );
	Element* progressSlider = getElementByName( _T("progressslider") );
	
	RECT validRect = progressSlider->getRectPos();
	  
	m_PlayProg = adjustSlider( progressSlider, progressBar );

	InvalidateRect( m_hWnd, &validRect, false );
}
////////////////////////////
//通过按钮名称获取按钮
Element* MainWnd::getElementByName( string str )
{
	vector<Element>::iterator ite;
	
	for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ )
	{
		if( str.compare( ite->getName() ) == 0 )
			break;
	}

	if( ite == m_vecElement.end() )
	{
		return NULL;
	}
	
	return ite;
}
//////////////////////
//设置曲目标题
void MainWnd::setTitle( string str )
{
	static int i = 0;

	if( str.compare( _T("") ) == 0 )
	{
		str = _T("    xMedia Player");
	}

	str = _T("    ") + str;

	string istr = str.substr( i );
	i++;

	if( i >= strlen(str.c_str()) )
		i = 0;
	
	Element* elem = getElementByName( "songtitle" );
	RECT rect;

	elem->setText( istr, m_hTitleFont, DT_LEFT|DT_VCENTER );

	rect = elem->getRectPos();
	InvalidateRect( m_hWnd, &rect, false );
}
///////////////////////
//设置播放曲目长度 
void MainWnd::setLength( long len )
{	
	Element* elem = getElementByName( "timewnd" );
	RECT rect;

	if( len != 0 )
	{
		rect.left = 0;
	}
	char strBPS[MAX_PATH];
	sprintf( strBPS, "%d:%d", len/60, len%60 );

	elem->setText( strBPS, m_hTitleFont );
	rect = elem->getRectPos();

	InvalidateRect( m_hWnd, &rect, false );
}
///////////////////////
//设置曲目位速率
void MainWnd::setBPS( long bps )
{
//	HDC hdc = GetDC( m_hWnd );

	Element* elem = getElementByName( "bspwnd" );
	RECT rect;

	char strBPS[MAX_PATH];
	sprintf( strBPS, "%dKBPS", bps );

	elem->setText( strBPS, m_hFont );
	rect = elem->getRectPos();

	InvalidateRect( m_hWnd, &rect, false );

	elem = getElementByName( "freqwnd" );
	if( bps == 0 )
	{
		elem->setText( "0KHz", m_hFont );
	}
	else
	{
		elem->setText( "44KHz", m_hFont );
	}

	rect = elem->getRectPos();

	InvalidateRect( m_hWnd, &rect, false );
//	DrawText( hdc, strBPS, strlen( strBPS ), &elem->getRectPos(), DT_CENTER|DT_VCENTER );
}
///////////////////////
//设置播放进度
void MainWnd::setPlayProg( int playProg )
{
	if( m_isDraggingElem )
	{
		return;
	}

	Element* progressBar = getElementByName( _T("progressbar") );
	Element* progressSlider = getElementByName( _T("progressslider") );
	
	RECT validRect = progressSlider->getRectPos();
	  
	adjustSlider( progressSlider, progressBar, playProg );

	InvalidateRect( m_hWnd, &validRect, false );
}
///////////////////////
//设置音量
void MainWnd::setVolumn( int vol )
{
	if( m_isDraggingElem )
	{
		return;
	}

	Element* soundBar = getElementByName( _T("soundbar") );
	Element* soundSlider = getElementByName( _T("soundslider") );
	
	RECT validRect = soundSlider->getRectPos();
	  
	adjustSlider( soundSlider, soundBar, vol );

	InvalidateRect( m_hWnd, &validRect, false );
}
/////////////////////////
//设置声道
void MainWnd::setTrack( int track )
{
	if( m_isDraggingElem )
	{
		return;
	}

	Element* trackBar = getElementByName( _T("trackbar") );
	Element* trackSlider = getElementByName( _T("trackslider") );
	
	RECT validRect = trackSlider->getRectPos();
	  
	adjustSlider( trackSlider, trackBar, track );

	InvalidateRect( m_hWnd, &validRect, false );
}
/////////////////////////
//初始化声音
bool MainWnd::InitVolumn()
{
	WAVEFORMATEX  Format;
	
	Format.cbSize = sizeof( Format );
	Format.nAvgBytesPerSec = 88200;
	Format.nBlockAlign = 4;
	Format.nChannels = 2;
	Format.nSamplesPerSec = 22050;
	Format.wFormatTag = 1;
	Format.wBitsPerSample=16;
	if( waveOutOpen((LPHWAVEOUT)&m_hWaveOut, WAVE_MAPPER, 
                    (LPWAVEFORMATEX)&Format, 
                    0l, 0L, CALLBACK_NULL ))
	{
		return false;
	}

	DWORD vol;
	waveOutGetVolume( m_hWaveOut, &vol );
	WORD lVol,rVol,iVol;
	lVol = LOWORD( vol );
	rVol = HIWORD( vol );
	iVol = (int)(max( lVol, rVol ) * 100 / 0xffff);

	m_Track = 50 - ((lVol - rVol)*100/0xffff);

	setTrack( m_Track );

	setVolumn( 100 - iVol );

	return true;
}